home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue25 / hipsquar / DELPHI.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1997-06-07  |  6.2 KB  |  237 lines

  1. {*********************************************************}
  2. {                                                         }
  3. {     Creating Non-Rectangular Windows                    }
  4. {                                                         }
  5. {     Requires Win32 API (Delphi 2.0 or 3.0 or newer)     }
  6. {                                                         }
  7. {     Copyright ⌐ 1997 Steven J. Colagiovanni             }
  8. {                                                         }
  9. {*********************************************************}
  10.  
  11. unit Delphi;
  12.  
  13. interface
  14.  
  15. uses
  16.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  17.   cmp_TBackDrop;
  18.  
  19. type
  20.   TfrmDelphi = class(TForm)
  21.         procedure FormCreate(Sender: TObject);
  22.         procedure FormKeyDown(Sender: TObject; var Key: Word;
  23.             Shift: TShiftState);
  24.     procedure FormPaint(Sender: TObject);
  25.     private
  26.         { Private declarations }
  27.         procedure WMNCHitTest(Var Msg: TMessage); message WM_NCHITTEST;
  28.         procedure ConstructPath;
  29.     public
  30.         { Public declarations }
  31.     end;
  32.  
  33. var
  34.     frmDelphi: TfrmDelphi;
  35.  
  36. implementation
  37.  
  38. {$R *.DFM}
  39.  
  40. procedure TfrmDelphi.WMNCHitTest(Var Msg: TMessage);
  41. begin
  42.     { Respond to left mouse button down, so we can drag window }
  43.     if GetAsyncKeyState(VK_LButton) < 0 then
  44.         Msg.Result := HTCaption
  45.     else
  46.         Msg.Result := HTClient;
  47.  
  48.     { if right mouse button down, close window }
  49.     if GetAsyncKeyState(VK_RButton) < 0 then
  50.         Close;
  51. end;
  52.  
  53. procedure TfrmDelphi.ConstructPath;
  54. var
  55.     RgnPts: array[0..12] of TPoint;
  56.  
  57. Const
  58.     nPts: integer = 3;
  59.  
  60. begin
  61.     BeginPath(Canvas.Handle);
  62.  
  63.     { Outside 'D' }
  64.     MoveToEx(Canvas.Handle, 49, 0, nil);
  65.  
  66.     RgnPts[0] := Point(62, 2);        // control point
  67.     RgnPts[1] := Point(79, 18);        // control point
  68.     RgnPts[2] := Point(81, 36);        // end point
  69.     PolyBezierTo(Canvas.Handle, RgnPts[0], nPts);
  70.  
  71.     LineTo(Canvas.Handle, 81, 53);
  72.  
  73.     RgnPts[0] := Point(79, 70);        // control point
  74.     RgnPts[1] := Point(64, 86);        // control point
  75.     RgnPts[2] := Point(47, 88);        // end point
  76.     PolyBezierTo(Canvas.Handle, RgnPts[0], nPts);
  77.  
  78.     RgnPts[0] := Point(47, 88);
  79.     RgnPts[1] := Point(0, 88);
  80.     RgnPts[2] := Point(0, 0);
  81.     RgnPts[3] := Point(49, 0);
  82.     PolylineTo(Canvas.Handle, RgnPts[0],4);
  83.  
  84.     { Inside 'D' }
  85.     RgnPts[0] := Point(40, 68);
  86.     RgnPts[1] := Point(27, 68);
  87.     RgnPts[2] := Point(27, 20);
  88.     RgnPts[3] := Point(40, 20);
  89.     PolylineTo(Canvas.Handle, RgnPts[0], 4);
  90.  
  91.     RgnPts[0] := Point(47, 21);        // control point
  92.     RgnPts[1] := Point(53, 28);        // control point
  93.     RgnPts[2] := Point(54, 36);        // end point
  94.     PolyBezierTo(Canvas.Handle, RgnPts[0], nPts);
  95.  
  96.     LineTo(Canvas.Handle, 54, 52);
  97.  
  98.     RgnPts[0] := Point(53, 60);        // control point
  99.     RgnPts[1] := Point(47, 67);        // control point
  100.     RgnPts[2] := Point(40, 68);        // end point
  101.     PolyBezierTo(Canvas.Handle, RgnPts[0], nPts);
  102.  
  103.     { 'E' }
  104.     RgnPts[0] := Point(96, 0);
  105.     RgnPts[1] := Point(169, 0);
  106.     RgnPts[2] := Point(169, 18);
  107.     RgnPts[3] := Point(123, 18);
  108.     RgnPts[4] := Point(123, 33);
  109.     RgnPts[5] := Point(165, 33);
  110.     RgnPts[6] := Point(165, 50);
  111.     RgnPts[7] := Point(123, 50);
  112.     RgnPts[8] := Point(123, 68);
  113.     RgnPts[9] := Point(170, 68);
  114.     RgnPts[10] := Point(170, 88);
  115.     RgnPts[11] := Point(96, 88);
  116.     Polygon(Canvas.Handle, RgnPts[0], 12);
  117.  
  118.     { 'L' }
  119.     RgnPts[0] := Point(186, 0);
  120.     RgnPts[1] := Point(213, 0);
  121.     RgnPts[2] := Point(213, 67);
  122.     RgnPts[3] := Point(256, 67);
  123.     RgnPts[4] := Point(256, 88);
  124.     RgnPts[5] := Point(186, 88);
  125.     Polygon(Canvas.Handle, RgnPts[0], 6);
  126.  
  127.     { Outside 'P' }
  128.     MoveToEx(Canvas.Handle, 320, 0, nil);
  129.  
  130.     RgnPts[0] := Point(332, 2);        // control point
  131.     RgnPts[1] := Point(342, 11);        // control point
  132.     RgnPts[2] := Point(344, 22);        // end point
  133.     PolyBezierTo(Canvas.Handle, RgnPts[0], nPts);
  134.  
  135.     LineTo(Canvas.Handle, 344, 33);
  136.  
  137.     RgnPts[0] := Point(342, 44);        // control point
  138.     RgnPts[1] := Point(332, 53);        // control point
  139.     RgnPts[2] := Point(320, 55);        // end point
  140.     PolyBezierTo(Canvas.Handle, RgnPts[0], nPts);
  141.  
  142.     RgnPts[0] := Point(296, 55);
  143.     RgnPts[1] := Point(296, 88);
  144.     RgnPts[2] := Point(269, 88);
  145.     RgnPts[3] := Point(269, 0);
  146.     RgnPts[4] := Point(320, 0);
  147.     PolyLineTo(Canvas.Handle, RgnPts[0], 5);
  148.  
  149.     { Inside 'P' }
  150.     RgnPts[0] := Point(309, 38);
  151.     RgnPts[1] := Point(296, 38);
  152.     RgnPts[2] := Point(296, 17);
  153.     RgnPts[3] := Point(309, 17);
  154.     PolyLineTo(Canvas.Handle, RgnPts[0], 4);
  155.  
  156.     RgnPts[0] := Point(313, 18);        // control point
  157.     RgnPts[1] := Point(316, 21);        // control point
  158.     RgnPts[2] := Point(317, 25);        // end point
  159.     PolyBezierTo(Canvas.Handle, RgnPts[0], nPts);
  160.  
  161.     LineTo(Canvas.Handle, 317, 30);
  162.  
  163.     RgnPts[0] := Point(316, 34);        // control point
  164.     RgnPts[1] := Point(313, 37);        // control point
  165.     RgnPts[2] := Point(309, 38);        // end point
  166.     PolyBezierTo(Canvas.Handle, RgnPts[0], nPts);
  167.  
  168.     { 'H' }
  169.     RgnPts[0] := Point(359, 0);
  170.     RgnPts[1] := Point(386, 0);
  171.     RgnPts[2] := Point(386, 31);
  172.     RgnPts[3] := Point(417, 31);
  173.     RgnPts[4] := Point(417, 0);
  174.     RgnPts[5] := Point(444, 0);
  175.     RgnPts[6] := Point(444, 88);
  176.     RgnPts[7] := Point(417, 88);
  177.     RgnPts[8] := Point(417, 52);
  178.     RgnPts[9] := Point(386, 52);
  179.     RgnPts[10] := Point(386, 88);
  180.     RgnPts[11] := Point(359, 88);
  181.     Polygon(Canvas.Handle, RgnPts[0], 12);
  182.  
  183.     { 'I' }
  184.     RgnPts[0] := Point(464, 0);
  185.     RgnPts[1] := Point(491, 0);
  186.     RgnPts[2] := Point(491, 88);
  187.     RgnPts[3] := Point(464, 88);
  188.     Polygon(Canvas.Handle, RgnPts[0], 4);
  189.  
  190.     EndPath(Canvas.Handle);
  191. end;
  192.  
  193.  
  194. procedure TfrmDelphi.FormCreate(Sender: TObject);
  195. var
  196.     Region1: hRgn;
  197. begin
  198.     ConstructPath;
  199.     { Create region, or window boundaries from the constructed Path }
  200.     Region1 := PathToRegion(Canvas.Handle);
  201.     { Assign the region to the window }
  202.     SetWindowRgn(Handle, Region1, True);
  203.  
  204.     { Do not delete region - Windows now has control
  205.         of the region. }
  206.  
  207. end;
  208.  
  209. procedure TfrmDelphi.FormKeyDown(Sender: TObject; var Key: Word;
  210.     Shift: TShiftState);
  211. begin
  212.     if key = VK_Escape then Close;
  213. end;
  214.  
  215. procedure TfrmDelphi.FormPaint(Sender: TObject);
  216. var
  217.     lin, Grn: byte;
  218.  
  219. begin
  220.     { Paint Graduated letters/background, from red to yellow }
  221.     Canvas.Brush.Style := bsSolid;
  222.     Canvas.Pen.Style := psClear;
  223.  
  224.     { Paint in 30 steps }
  225.     { First step will be RGB(255, 0, 0) = clRed }
  226.     
  227.     For lin := 0 to 29 do
  228.     begin
  229.         Grn := Trunc(lin * 8.5);
  230.         Canvas.Brush.Color := RGB(255, Grn, 0);
  231.         Canvas.Rectangle(0, lin*3, Width, (lin*3)+4);
  232.     end;
  233.  
  234. end;
  235.  
  236. end.
  237.